package day11;

/**
 * @author aiPlusPlus
 * @version 1.0
 * @date 2023/2/11 13:01
 */

import java.util.Deque;
import java.util.LinkedList;

/**
 * 给你一个 n x n 的二进制矩阵 grid 中，返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径，返回 -1 。
 *
 * 二进制矩阵中的 畅通路径 是一条从 左上角 单元格（即，(0, 0)）到 右下角 单元格（即，(n - 1, n - 1)）的路径，该路径同时满足下述要求：
 *
 * 路径途经的所有单元格都的值都是 0 。
 * 路径中所有相邻的单元格应当在 8 个方向之一 上连通（即，相邻两单元之间彼此不同且共享一条边或者一个角）。
 * 畅通路径的长度 是该路径途经的单元格总数。
 *
 *
 *
 * 示例 1：
 *
 *
 * 输入：grid = [[0,1],[1,0]]
 * 输出：2
 * 示例 2：
 *
 *
 * 输入：grid = [[0,0,0],[1,1,0],[1,1,0]]
 * 输出：4
 * 示例 3：
 *
 * 输入：grid = [[1,0,0],[1,1,0],[1,1,0]]
 * 输出：-1
 */
public class Solution2 {
    int[] dx = {-1, 0, 1, 0, -1, -1, 1, 1};
    int[] dy = {0, -1, 0, 1, -1, 1, -1, 1};
    public int shortestPathBinaryMatrix(int[][] grid) {
        int n = grid.length;
        if (grid[0][0] == 1 || grid[n - 1][n - 1] == 1) {
            return -1;
        }
        if (n == 1) {
            return 1;
        }
        Deque<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{0, 0});
        grid[0][0] = 1;
        int step = 1;
        while (!queue.isEmpty()) {
            int sz = queue.size();
            while (sz-- > 0) {
                int[] cell = queue.poll();
                int i = cell[0], j = cell[1];
                for (int k = 0; k < dx.length; ++k) {
                    int x = i + dx[k], y = j + dy[k];
                    if (x >= 0 && x < n && y >= 0 && y < n && grid[x][y] == 0) {
                        if (x == n - 1 &&  y == n - 1) {
                            return step + 1;
                        }
                        queue.offer(new int[]{x, y});
                        grid[x][y] = 1;
                    }
                }
            }
            step++;
        }
        return -1;
    }
}
